package org.samples.filter;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
	
	@Pointcut("execution(* org.samples.web..*.*(..))")
	public void allMethod(){}
	
	@After("allMethod()")
	public void afterLog(JoinPoint point){
		System.out.println("afterLog ------------ 最终通知");
		System.out.println("afterLog ------------ 目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
		System.out.println("afterLog ------------ 参数为:" + Arrays.toString(point.getArgs()));
		System.out.println("afterLog ------------ 被织入的对象为:" + point.getTarget());
	}
	
	@AfterReturning(value = "allMethod()", returning = "returnValue")
	public void afterReturningLog(JoinPoint point, Object returnValue){
		System.out.println("afterReturningLog ------------ 返回值后通知");
		System.out.println("afterReturningLog ------------ 目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
		System.out.println("afterReturningLog ------------ 参数为:" + Arrays.toString(point.getArgs()));
		System.out.println("afterReturningLog ------------ 返回值:" + returnValue);
		System.out.println();
	}
	
	@AfterThrowing(value = "allMethod()", throwing = "ex")
	public void afterThrowingLog(Throwable ex){
		System.out.println("afterThrowingLog ------------ 返回值后通知");
		System.out.println("afterThrowingLog ------------ 异常信息:" + ex.getMessage());
		System.out.println();
	}
	
	@Around("allMethod()")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("AROUND ------------ 进入环绕通知");
		Object obj = pjp.proceed();
		System.out.println("AROUND ------------ 结束方法调用");
		return obj;
	}
	
//	@Pointcut("execution(* org.samples.web..*.*(..))")
//	
//	public void allMethod(){}
//	@Before("allMethod")
//	public void addBeforeLog(){
//		System.out.println("--系统：准备进入保存方法--");
//	}
//	
//	@After("allMethod()")
//	public void afterLog(JoinPoint point){
//		System.out.println("afterLog ------------ 目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()+"---");
//		System.out.println("afterLog ------------ 参数为:" + Arrays.toString(point.getArgs())+"-----");
//	}
//	
//	@Pointcut("execution(* org.samples.web..*.*(..))")
//	private void editMetod(){}
//	
//	@Before("editMethod()")
//	public void editBeforeLog(){
//		System.out.println("--系统：准备进入保存方法--");
//	}
//	
//	@After("editMetod()")
//	public void editAfterLog(JoinPoint point){
//		System.out.println("editAfterLog ------------ 目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()+"---");
//		System.out.println("editAfterLog ------------ 参数为:" + Arrays.toString(point.getArgs())+"-----");
//	}
}
